/***************************************************************************
 *   oboe.controllers.KeyboardController                                   *
 *   Copyright (C) 2011 by Felipe Manga                                    *
 *   lufeboma@gmail.com                                                    *
 *                                                                         *
 *   Permission is hereby granted, free of charge, to any person obtaining *
 *   a copy of this software and associated documentation files (the       *
 *   "Software"), to deal in the Software without restriction, including   *
 *   without limitation the rights to use, copy, modify, merge, publish,   *
 *   distribute, sublicense, and/or sell copies of the Software, and to    *
 *   permit persons to whom the Software is furnished to do so, subject to *
 *   the following conditions:                                             *
 *                                                                         *
 *   The above copyright notice and this permission notice shall be        *
 *   included in all copies or substantial portions of the Software.       *
 *                                                                         *
 *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       *
 *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    *
 *   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
 *   IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR     *
 *   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
 *   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR *
 *   OTHER DEALINGS IN THE SOFTWARE.                                       *
 ***************************************************************************/


package oboe.controllers
{
	import flash.events.KeyboardEvent;
	
	import oboe.core.Oboe;
	import oboe.core.SigSlot;
	
	public class KeyboardController extends SigSlot
	{
		private var listenerAdded:Boolean;
		private var eventList:int;
		
		public static const KEY_DOWN:int = 1;
		public static const KEY_UP:int = 2;
		
		public static const SIG_ONKEYUP:String = "onKeyUp";
		public static const SIG_ONKEYDOWN:String = "onKeyDown";
		
		public function KeyboardController( events:int )
		{
			super();
			this.listenerAdded = false;
			this.eventList = events;
		}
		
		[slot(alias=enableKeyboard)] override public function onAddToRoot():void
		{
			if( this.getLastSlotCalled() ) super.onAddToRoot();
			if( !this.listenerAdded )
			{
				if( this.eventList & KEY_DOWN )
				{
					Oboe.stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
				}
				if( this.eventList & KEY_UP )
				{
					Oboe.stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
				}
			}
			this.listenerAdded = true;			
		}
		
		[slot(alias=disableKeyboard)] override public function onRemoveFromRoot():void
		{
			if( this.getLastSlotCalled() == "onRemoveFromRoot" ) super.onRemoveFromRoot();
			if( !this.listenerAdded ) return;
			this.listenerAdded = false;
			if( this.eventList & KEY_DOWN )
			{
				Oboe.stage.removeEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
			}
			if( this.eventList & KEY_UP )
			{
				Oboe.stage.removeEventListener(KeyboardEvent.KEY_UP, onKeyUp);
			}
		}
		
//		public function slot_onAddToParent():void
//		{
//			this.slot_enableKeyboard();
//		}
//		
//		public function slot_onRemoveFromParent():void
//		{
//			this.slot_disableKeyboard();
//		}
		
		private function onKeyDown( k:KeyboardEvent ):void
		{
			this.signalUp(SIG_ONKEYDOWN, k);
		}

		private function onKeyUp( k:KeyboardEvent ):void
		{
			this.signalUp(SIG_ONKEYUP, k);
		}
	}
}